﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using InfraWEB.DAL;
using InfraWEB.DAL.InfraTableAdapters;

namespace InfraWEB.BLL
{
    [System.ComponentModel.DataObject]
	public class Predio
	{
        private PredioTableAdapter _predioAdapter = null;
        protected PredioTableAdapter Adapter
        {
            get
            {
                if (_predioAdapter == null)
                {
                    _predioAdapter = new PredioTableAdapter();
                }
                return _predioAdapter;
            }
        }

        /// <summary>
        /// Obtém todos os prédios.
        /// </summary>
        /// <returns>Infra.Predio.Datatable</returns>
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, true)]
        public Infra.PredioDataTable GetAllPredios()
        {
            return Adapter.GetAllPredios();
        }

		/// <summary>
		/// Obtém prédio pelo Id.
		/// </summary>
		/// <param name="id"></param>
		/// <returns>Infra.Predio.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)]
		public Infra.PredioDataTable GetPredioByPreId(int id)
		{
			return Adapter.GetPredioByPreId(id);
		}

		/// <summary>
		/// Obtém prédio pelo Nome.
		/// </summary>
		/// <param name="nome"></param>
		/// <returns>Infra.Predio.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)]
		public Infra.PredioDataTable GetPredioByPreNome(string nome)
		{
			return Adapter.GetPredioByPreNome(nome);
		}

		/// <summary>
		/// Verifica se nome existe.
		/// </summary>
		/// <param name="nome"></param>
		/// <returns>Infra.Usuario.Datatable</returns>
		public bool ChechIfNomeExists(string nome)
		{
			Predio building = new Predio();
			if (building.GetPredioByPreNome(nome).Count != 0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}

		/// <summary>
		/// Persiste prédio no banco de dados.
		/// </summary>
		/// <param name="nome"></param>
		/// <returns>true (caso o prédio seja persistido com sucesso)</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert, true)]
		public bool RecordPredio(string nome)
		{
			// Cria uma instância nova de PredioRow
			Infra.PredioDataTable predioTable = new Infra.PredioDataTable();
			Infra.PredioRow predioRow = predioTable.NewPredioRow();
			if (nome == string.Empty)
			{
				// Erro: campos obrigatórios nulos
				return false;
			}
			predioRow.PreNome = nome;

			// Persiste o novo prédio
			predioTable.AddPredioRow(predioRow);
			int rowsAffected = Adapter.Update(predioTable);

			// Retorna true se for persistida exatamente uma única linha, caso contrário, false
			return (rowsAffected == 1);
		}

		/// <summary>
		/// Atualiza dados do prédio.
		/// </summary>
		/// <param name="newNome"></param>
		/// <returns>true (caso o prédio seja persistido com sucesso)</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert, true)]
		public bool RecordPredio(int id, string newNome)
		{
			Infra.PredioDataTable predioTable = Adapter.GetPredioByPreId(id);
			if (predioTable.Count == 0)
			{
				// Erro: prédio não existe
				return false;
			}

			// Obtém os dados do prédio identificado
			Infra.PredioRow predioRow = predioTable[0];
			if (newNome == null)
			{
				// Erro: campo obrigatório nulo
				return false;
			}
			predioRow.PreNome = newNome;

			// Atualiza o registro do prédio
			int rowsAffected = Adapter.Update(predioRow);

			// Retorna true se for atualizada exatamente uma única linha, caso contrário, false
			return (rowsAffected == 1);
		}

		/// <summary>
		/// Remove prédio (modifica o Status do prédio para false)
		/// </summary>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Delete, true)]
		public bool RemovePredio(int id)
		{
			Infra.PredioDataTable predioTable = Adapter.GetPredioByPreId(id);
			Infra.PredioRow predioRow = predioTable[0];

			// Remove o prédio
			int rowsAffected = Adapter.Delete(predioRow.PreId);

			// Retorna true se for atualizada exatamente uma única linha, caso contrário, false
			return (rowsAffected == 1);
		}
	}
}
